package me.haui.plg.backingBean.print;

import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import me.haui.plg.backingBean.sort.AlphanumComparator;
import me.haui.plg.backingBean.sort.SortierungComparator;
import me.haui.plg.entity.Auspraegung;
import me.haui.plg.entity.Leitfaden;
import me.haui.plg.entity.Rahmenbedingung;
import me.haui.plg.entity.RahmenbedingungUnterpunkt;/*
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
*/
/**
 *
 * @author haui
 */
public class PrintLeitfadenManuallyBecauseJasperAndApachePOIXWPF {

/*    
    public void doPrint(Leitfaden currentLeitfaden) throws IOException{
    
                        
        HttpServletResponse httpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();          
        
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();;        
                
        addHTTHeaderInformation(httpServletResponse, currentLeitfaden);  
        
        //XWPFDocument document = new XWPFDocument();
        
        
        //Haui hier dann
        //addFirstPartOfDocument(document, currentLeitfaden);
        //addRahmenbedingugenAndCoToDocument(currentLeitfaden, document); 
        
        servletOutputStream.print("<html>"
                + "<head>"
                + "<body>"
                + "test"
                + "</body>"
                + "</head>"
                + "</hmtl>");
        
        servletOutputStream.flush();
                        
        FacesContext.getCurrentInstance().responseComplete();        
            
    }

    private void addHTTHeaderInformation(HttpServletResponse httpServletResponse, Leitfaden currentLeitfaden) {
        
        httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + currentLeitfaden.getName().replace(" ", "_") +"_Leitfaden.docx");  
        //Problem von Firefox dass ausschließlich Content-disposition nicht reicht um
        //downgeloadete Datei mit Microsoft Word zu öffnen. Datei wird zB direkt von Firefox
        //Browser geöffnet. Was XML Parserfehler zur Folge hat.
        httpServletResponse.addHeader("Content-Type", "application/msword");
        
    }

    private void addFirstPartOfDocument(XWPFDocument document, Leitfaden currentLeitfaden) {
        
        XWPFParagraph paragraphOne = document.createParagraph();
        XWPFRun paragraphOneRunOne = paragraphOne.createRun();
        
        //Setting heading of the document.
        paragraphOneRunOne.setText( currentLeitfaden.getName() );
                
        XWPFParagraph paragraphTwo = document.createParagraph();
        XWPFRun paragraphTwoRunOne = paragraphTwo.createRun();
        
        //Setting description of our document.
        paragraphTwoRunOne.addBreak();
        paragraphTwoRunOne.setText( currentLeitfaden.getBeschreibung() );
        paragraphTwoRunOne.addBreak();
        paragraphTwoRunOne.addBreak();
        paragraphTwoRunOne.addBreak();
        paragraphTwoRunOne.addBreak();
        
    }

    private void addRahmenbedingugenAndCoToDocument(Leitfaden currentLeitfaden, XWPFDocument document) {
        
        
        List<Rahmenbedingung>  rahmenbedingungCollection = (List<Rahmenbedingung>) currentLeitfaden.getRahmenbedingungCollection();
        

        //http://tutorials.jenkov.com/java-collections/sorting.html
        //Jedoch ohne generische Angabe bei selbst erstellter Klasse
        //http://www.programmersbase.net/Content/Java/Content/Tutorial/Java/Interface.htm
                
        Collections.sort(rahmenbedingungCollection, new SortierungComparator());

        for ( Rahmenbedingung r : rahmenbedingungCollection ){
            
            XWPFParagraph newParagraph = document.createParagraph();
            XWPFRun newParagraphRunOne = newParagraph.createRun();
        
            //Setting heading of the document.
            //Haui hier dann später die Feldnamen noch überall richtigstellen
            newParagraphRunOne.setText( r.getKurzbezeichnung() /*+ r.getSortierung()* / );
            newParagraphRunOne.addBreak();
            newParagraphRunOne.addBreak();
            newParagraphRunOne.setText( r.getName() );
            newParagraphRunOne.addBreak();
            newParagraphRunOne.addBreak();
            
            addRahmenbedingungDetailsTable(document, r);
                        
        }
        

        if ("1".equals("1"))
            return;
        
        
        // New 2x2 table
        XWPFTable tableOne = document.createTable();
        XWPFTableRow tableOneRowOne = tableOne.getRow(0);
        tableOneRowOne.getCell(0).setText("Hello");
        tableOneRowOne.addNewTableCell().setText("World");
 
        XWPFTableRow tableOneRowTwo = tableOne.createRow();
        tableOneRowTwo.getCell(0).setText("This is");
        tableOneRowTwo.getCell(1).setText("a table");
 
        //Add a break between the tables
        document.createParagraph().createRun().addBreak();
 
        // New 3x3 table
        XWPFTable tableTwo = document.createTable();
        XWPFTableRow tableTwoRowOne = tableTwo.getRow(0);
        tableTwoRowOne.getCell(0).setText("col one, row one");
        tableTwoRowOne.addNewTableCell().setText("col two, row one");
        tableTwoRowOne.addNewTableCell().setText("col three, row one");
 
        XWPFTableRow tableTwoRowTwo = tableTwo.createRow();
        tableTwoRowTwo.getCell(0).setText("col one, row two");
        tableTwoRowTwo.getCell(1).setText("col two, row two");
        tableTwoRowTwo.getCell(2).setText("col three, row two");
 
        //XWPFDocument x = new XWPFDocument();
        XWPFTable t = document.createTable();
        t.getRow(0).getCell(0).setText("Test 1");
        
        
        //In case of error when adding a table to a table cell
        //http://apache-poi.1045710.n5.nabble.com/Get-an-error-when-i-try-adding-a-table-in-a-cell-td4761912.html
        //http://poi.apache.org/faq.html#faq-N10025
        CTTbl ctTable = CTTbl.Factory.newInstance();
        XWPFTable xtab = new XWPFTable(ctTable, document);        
        xtab.getRow(0).getCell(0).setText("Test 2 mit Tabelle");
        
        
        XWPFTableRow tableTwoRowThree = tableTwo.createRow();
        tableTwoRowThree.getCell(0).insertTable(0, xtab );
        //tableTwoRowThree.getCell(0).
        //tableTwoRowThree.getCell(0).setText("col one, row three");
        tableTwoRowThree.getCell(1).setText("col two, row three");
        tableTwoRowThree.getCell(2).setText("col three, row three");
        
        
    }

    private void addRahmenbedingungDetailsTable(XWPFDocument document, Rahmenbedingung r) {

        
        List<RahmenbedingungUnterpunkt>  rahmenbedUnterPunktList = (List<RahmenbedingungUnterpunkt>) r.getRahmenbedingungUnterpunktCollection();
        
        if (rahmenbedUnterPunktList.isEmpty() == false){
        
            //Haui hier später wenn auf Sortierung umgestellt
            //ebenfalls umstellen.
            Collections.sort(rahmenbedUnterPunktList, new AlphanumComparator());
            
            
            XWPFTable tableOne = document.createTable();
            XWPFTableRow tableOneRowOne = tableOne.getRow(0);
            //Haui erste Zeile noch fett machen
            tableOneRowOne.getCell(0).setText( r.getKurzbezeichnung() );
            tableOneRowOne.addNewTableCell().setText("Detailerklärungen");
            tableOneRowOne.getCell(1).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
   /**         
            //Merging the cell horizontally.
            CTTc ctTc = tableOneRowOne.getCell(0).getCTTc();
            CTTcPr tcPr = ctTc.addNewTcPr();
            CTHMerge hMerge = tcPr.addNewHMerge();
** /            
            
            
            XWPFTableRow tableOneRowTwo = tableOne.createRow();
            tableOneRowTwo.getCell(0).setText( "" );
            tableOneRowTwo.getCell(1).setText("Name");
            tableOneRowTwo.addNewTableCell().setText("Beschreibung");
            tableOneRowTwo.addNewTableCell().setText("Erläuterung");

/**            
CTTc ctTc = tableOneRowTwo.getCell(0).getCTTc();
CTTcPr tcPr = ctTc.addNewTcPr();
CTHMerge hMerge = tcPr.addNewHMerge();
hMerge.setVal(STMerge.RESTART);
** /            
            
            Iterator<RahmenbedingungUnterpunkt> ruIterator = rahmenbedUnterPunktList.iterator();
            
            //Cycle over Rahmenbedingungunterpunkt
            while ( ruIterator.hasNext() ) {

                RahmenbedingungUnterpunkt ru = ruIterator.next();
                
                XWPFTableRow newTableRow = tableOne.createRow();
                
                newTableRow.getCell(0).setText( ru.getName() 
                        + "\n\n" 
                        + ru.getBeschreibung() 
                        //+ ru.getKurzbezeichnung()
                        );
                
                //Add Auspraegungen
                List<Auspraegung>  auspraegungList = (List<Auspraegung>) ru.getAuspraegungCollection();
                //Haui hier später wenn auf Sortierung umgestellt
                //ebenfalls umstellen.
                Collections.sort(auspraegungList, new AlphanumComparator());
                
                //Cycle over Auspraegung
                Iterator<Auspraegung> auspraegungIterator = auspraegungList.iterator();
                while ( auspraegungIterator.hasNext() ) {

                    Auspraegung a = auspraegungIterator.next();
                    
              /**
                    //In case of error when adding a table to a table cell
                    //http://apache-poi.1045710.n5.nabble.com/Get-an-error-when-i-try-adding-a-table-in-a-cell-td4761912.html
                    //http://poi.apache.org/faq.html#faq-N10025
                    CTTbl ctTable = CTTbl.Factory.newInstance();
                    XWPFTable xtab = new XWPFTable(ctTable, newTableRow.getCell(1));
                    
                    xtab.getRow(0).getCell(0).setText( "Haui mojo");
                    //xtab.getRow(0).getCell(1).setText( "Haui mojo");
                    
                    newTableRow.getCell(1).insertTable(1, xtab);
                    //newTableRow.getCell(1).insertTable(1, xtab);
                    //newTableRow.getCell(0).i
              **/
                    
                    
        /**
        XWPFTable tableTwo = document.createTable();
         XWPFTableRow tableTwoRowOne = tableTwo.getRow(0);
         tableTwoRowOne.getCell(0).setText("Haui 1");
         tableTwoRowOne.addNewTableCell().setText("Haui 2");
         tableTwoRowOne.addNewTableCell().setText("Haui 3");
                    
         newTableRow.getCell(1).insertTable(1, tableTwo);
           ** /         
                    
                    newTableRow.getCell(1).setText( a.getName() 
                            //+ "\n\n" 
                            //+ a.getBeschreibung() 
                            //+ a.getErlaeuterung()
                            //+ a.getKurzbezeichnung()
                            );
                    
                    newTableRow.addNewTableCell().setText( a.getBeschreibung() );
                    
                    newTableRow.addNewTableCell().setText( a.getErlaeuterung() );
                    
                    if ( auspraegungIterator.hasNext() ==  true ){                        
                        newTableRow = tableOne.createRow();
                    }
                    
                }
                
            }

        
                        
        }
        
        //Adding line breaks after each Rahmenbedingung.
        XWPFParagraph newParagraph = document.createParagraph();
        XWPFRun newParagraphRunOne = newParagraph.createRun();

        newParagraphRunOne.addBreak();
        newParagraphRunOne.addBreak();
        newParagraphRunOne.addBreak();
        newParagraphRunOne.addBreak();

        
        
    }
*/    
    
}
